数据结构 作业3、线性结构
开始时间09/09/2024 12:00:00 AM
结束时间12/25/2024 11:59:00 PM
答题时长155519分钟
答卷类型标准答案
试卷总分100
单选题56 分
2-1

下列各种数据结构中属于线性结构的有()

| 参考答案
答案
C
1分
2-2

以下数据结构中,( )是非线性数据结构。

| 参考答案
答案
A
1分
2-3

对于顺序存储的长度为NN的线性表,访问结点和增加结点的时间复杂度为:

| 参考答案
答案
B
1分
2-4

NN个结点的顺序表中,算法的时间复杂度为O(1)的操作是:

| 参考答案
答案
A
1分
2-5

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用哪种存储方式最节省时间?

| 参考答案
答案
D
1分
2-6

线性表若采用链式存储结构时,要求内存中可用存储单元的地址

| 参考答案
答案
B
1分
2-7

在具有NN个结点的单链表中,实现下列哪个操作,其算法的时间复杂度是O(N)O(N)

| 参考答案
答案
C
1分
2-8

某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?

| 参考答案
答案
B
1分
2-9

若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用哪种存储方式最节省运算时间?

| 参考答案
答案
D
1分
2-10

将线性表La和Lb头尾连接,要求时间复杂度为O(1),且占用辅助空间尽量小。应该使用哪种结构?

| 参考答案
答案
C
1分
2-11

线性表L在什么情况下适用于使用链式结构实现?

| 参考答案
答案
A
1分
2-12

对于一个具有NN个结点的单链表,在给定值为xx的结点后插入一个新结点的时间复杂度为

| 参考答案
答案
C
1分
2-13

链表不具有的特点是:

| 参考答案
答案
B
1分
2-14

h为不带头结点的单向链表。在h的头上插入一个新结点t的语句是:

| 参考答案
答案
D
1分
2-15

采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N1N_1N2N_2个,最高项指数分别为M1M_1M2M_2,则实现两个多项式相加的时间复杂度是:

| 参考答案
答案
A
1分
2-16

将两个结点数都为NN且都从小到大有序的单向链表合并成一个从小到大有序的单向链表,那么可能的最少比较次数是:

| 参考答案
答案
B
1分
2-17

有六个元素以6、5、4、3、2、1的顺序进栈,问哪个不是合法的出栈序列?

| 参考答案
答案
B
1分
2-18

若一个栈的入栈序列为1、2、3、…、NN,输出序列的第一个元素是ii,则第jj个输出元素是:

| 参考答案
答案
D
1分
2-19

若一个栈的入栈序列为1、2、3、…、NN,其输出序列为p1p_1p2p_2p3p_3、…、pNp_N。若p1=Np_1=N,则pip_i为:

| 参考答案
答案
C
1分
2-20

令P代表入栈,O代表出栈。若利用堆栈将中缀表达式3*2+8/4转为后缀表达式,则相应的堆栈操作序列是:

| 参考答案
答案
C
2分
2-21

若借助堆栈将中缀表达式a+b*c+(d*e+f)*g转换为后缀表达式,当读入f时,堆栈里的内容是什么(按堆栈自底向上顺序)?

| 参考答案
答案
B
2分
2-22

设一个堆栈的入栈顺序是1、2、3、4、5。若第一个出栈的元素是4,则最后一个出栈的元素必定是:

| 参考答案
答案
D
1分
2-23

表达式a*(b+c)-d的后缀表达式是:

| 参考答案
答案
A
1分
2-24

从栈顶指针为ST的链栈中删除一个结点且用X保存被删结点的值,则执行:

| 参考答案
答案
C
1分
2-25

top为指向栈顶元素的指针,判定栈S(最多容纳m个元素)为空的条件是:

| 参考答案
答案
B
1分
2-26

若采用带头、尾指针的单向链表表示一个堆栈,那么该堆栈的栈顶指针top应该如何设置?

| 参考答案
答案
A
1分
2-27

利用大小为n的数组(下标从0n-1)存储一个栈时,假定栈从数组另一头开始且top==n表示栈空,则向这个栈插入一个元素时,修改top指针应当执行:

| 参考答案
答案
C
1分
2-28

为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是?

| 参考答案
答案
B
1分
2-29

若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3,其中x->y表示x的下一节点是y。此时,如果将对象4入队,然后队列头的对象出队,则单向链表的状态是:

| 参考答案
答案
B
1分
2-30

某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作。若元素a、b、c、d、e依次入此队列后再进行出队操作,则不可能得到的出队序列是:

| 参考答案
答案
D
1分
2-31

若用大小为6的数组来实现循环队列,且当前frontrear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,frontrear的值分别为多少?

| 参考答案
答案
A
1分
2-32

如果循环队列用大小为m的数组表示,且用队头指针front和队列元素个数size代替一般循环队列中的frontrear指针来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为:

| 参考答案
答案
B
1分
2-33

设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:

| 参考答案
答案
D
1分
2-34

给定一个堆栈的入栈序列为{ 1, 2, \cdots, nn },出栈序列为{ p1p_1, p2p_2, \cdots, pnp_n }。如果p2=np_2 = n,则存在多少种不同的出栈序列?

| 参考答案
答案
C
1分
2-35

采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N1N_1N2N_2个,最高项指数分别为M1M_1M2M_2,则实现两个多项式相乘的时间复杂度是:

| 参考答案
答案
A
1分
2-36

下列关于栈的叙述中,错误的是:

  1. 采用非递归方式重写递归程序时必须使用栈
  2. 函数调用时,系统要用栈保存必要的信息
  3. 只要确定了入栈次序,即可确定出栈次序
  4. 栈是一种受限的线性表,允许在其两端进行操作
| 参考答案
答案
C
1分
2-37

适用于压缩存储稀疏矩阵的两种存储结构是:

| 参考答案
答案
A
1分
2-38

已知指针ha和hb分别是两个单链表的头指针,下列算法将这两个链表首尾相连在一起,并形成一个循环链表(即ha的最后一个结点链接hb的第一个结点,hb的最后一个结点指向ha),返回ha作为该循环链表的头指针。请将该算法补充完整。

typedef struct node{
ElemType data;
    struct node *next;
}LNode;
LNode *merge(LNode *ha, LNode *hb) {
LNode *p=ha;
     if (ha==NULL || hb==NULL) {
cout<<”one or two link lists are empty!”<<endl;
          return NULL;
     }
     while ( p->next!=NULL )
           p=p->next;
     p->next=hb;
     while ( p->next!=NULL )
           p=p->next;
           __________
}

| 参考答案
答案
B
1分
2-39

在一个不带头结点的非空链式队列中,假设f和r分别为队头和队尾指针,则插入s所指的结点运算是( )。

| 参考答案
答案
B
1分
2-40

若栈S1S_1中保存整数,栈S2S_2中保存运算符,函数F()依次执行下述各步操作:

  • (1)从S1S_1中依次弹出两个操作数ab
  • (2)从S2S_2中弹出一个运算符op
  • (3)执行相应的运算b op a
  • (4)将运算结果压入S1S_1中。

假定S1S_1中的操作数依次是{ 5, 8, 3, 2 }(2在栈顶),S2S_2中的运算符依次是{ *, -, + }(+在栈顶)。调用3次F()后,S1S_1栈顶保存的值是:

| 参考答案
答案
B
1分
2-41

现有队列 Q 与栈 S,初始时 Q 中的元素依次是{ 1, 2, 3, 4, 5, 6 }(1在队头),S 为空。若允许下列3种操作:(1)出队并输出出队元素;(2)出队并将出队元素入栈;(3)出栈并输出出栈元素,则不能得到的输出序列是:

| 参考答案
答案
C
1分
2-42

设有一个 12×\times12 的对称矩阵MM,将其上三角部分的元素mi,jm_{i,j}1ij121\le i\le j\le 12)按行优先存入C语言的一维数组N中,元素m6,6m_{6,6}N中的下标是:

| 参考答案
答案
A
1分
2-43

稀疏矩阵采用三元组存储的时候,一般需要一个行逻辑链接的顺序表,用以指出每一行的第一个非零元素在三元组中的位置。用这个顺序表的主要目的是为了___。

| 参考答案
答案
D
1分
2-44

对空栈 SS 进行 Push 和 Pop 操作,入栈序列为 a, b, c, d, e,经过 Push, Push, Pop, Push, Pop, Push, Push, Pop 操作后,得到的出栈序列是:

| 参考答案
答案
D
1分
2-45

循环队列的引入,目的是为了克服( )。

| 参考答案
答案
A
1分
2-46

链表 - 存储密度

链表的存储密度 ▁▁▁▁▁ 。

| 参考答案
答案
C
1分
2-47

表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为( ),其中^为乘幂 。

| 参考答案
答案
D
1分
2-48

在作进栈运算时,应先判别栈是否(① );在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。

①: A. 空 B. 满 C. 上溢 D. 下溢

②: A. 空 B. 满 C. 上溢 D. 下溢

③: A. n-1 B. n C. n+1 D. n/2

| 参考答案
答案
B
1分
2-49

设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6 , s5,s1,则栈的容量至少应该是( )。

| 参考答案
答案
B
1分
2-50

元素A,B,C,D依次入栈,出栈无限制,则以下( )是可能的出栈序列。

| 参考答案
答案
B
1分
2-51

用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为( )。

| 参考答案
答案
D
1分
2-52

循环队列的队满条件为 ( )。

| 参考答案
答案
C
1分
2-53

栈和队列的共同点是( )。

| 参考答案
答案
C
1分
2-54

已知初始为空的队列 Q 的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作。若 Q 的入队序列是 1、2、3、4、5,则不能得到的出队序列是:

| 参考答案
答案
D
1分
填空题26 分
4-1

线性表是 n (n0)n \ (n \geq 0) 个数据元素的

2分
序列。

记作:L=( a1,a2,,an )L = (\ a_1, a_2, \cdots, a_n \ )

| 参考答案
填空#1
有限
| 评测详情
填空详情
2分
4-2

以下运算实现在链队上的入队列,请在空白处用适当句子予以填充。

void EnQueue(QueptrTp *lq,DataType x){
       LqueueTp *p;
       p=(LqueueTp *)malloc(sizeof(LqueueTp));
       
2分
=x; p->next=NULL; (lq->rear)->next=
2分
;
2分
; }
| 参考答案
填空#1
p->data
填空#2
p
填空#3
lq->rear=p
| 评测详情
填空详情
6分
4-3

栈的特点是

2分
,队列的特点是
2分

| 参考答案
填空#1
先进后出 | 后进先出 | 后出先进 | 先出后进
填空#2
先进先出 | 后进后出 | 先出先进 | 后出后进
| 评测详情
填空详情
4分
4-4

设栈S和队列Q的初始状态都为空,元素a,b,c,d,e,f依次通过栈S,一个元素出栈后即进入队列,若6个元素出队序列是bedfca,则栈S的容量至少应有能够存放

2分
个元素的空间。

| 参考答案
填空#1
4
| 评测详情
填空详情
2分
4-5

数组q[M](M等于6)存储一个循环队,first和last分别指向首尾指针。已知first=2,last=5。当从队列中删除一个元素,再插入两个元素后,first=

2分
,last=
2分

| 参考答案
填空#1
3
填空#2
1
| 评测详情
填空详情
4分
4-6

设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 6, 5, 4, 7, 3, 1},则栈S的容量至少是:

2分

| 参考答案
填空#1
5
| 评测详情
填空详情
2分
4-7

在有n个元素的顺序表中删除任意一个元素所需移动元素的平均次数为

2分

| 参考答案
填空#1
(n-1)/2
| 评测详情
填空详情
2分
4-8

在有n个元素的顺序表中的任意位置插入一个元素所需移动元素的平均次数为

2分

| 参考答案
填空#1
n/2
| 评测详情
填空详情
2分
4-9

在长度为n的顺序表L中将所有值为x的元素替换成y,该算法的时间复杂度为

2分

| 参考答案
填空#1
O(n)
| 评测详情
填空详情
2分
程序填空题18 分
5-1

The function is to return the reverse linked list of L, with a dummy header.

List Reverse( List L )
{
    Position Old_head, New_head, Temp;
    New_head = NULL;
    Old_head = L->Next;

    while ( Old_head )  {
        Temp = Old_head->Next;
        
3分
; New_head = Old_head; Old_head = Temp; }
3分
; return L; }
| 参考答案
填空#1
Old_head->Next = New_head
填空#2
L->Next = New_head
| 评测详情
填空详情
6分
5-2

Concatenation of lists is an operation where the elements of one list are added at the end of another list. For example, if we have a linked list L1→1→2→3 and another one L2→4→5→6. The function ListConcat is to return the head pointer of the list L→1→2→3→4→5→6.

The list structure is defined as the following:

typedef struct Node *PtrToNode;
struct Node{
    int Data;
    PtrToNode Next;
};
typedef PtrToNode List;

Please fill in the blanks.

List ListConcat( List L1, List L2 )
{
    List Tmp = L1;
    if ( !L1 ) return L2;
    while ( Tmp->Next )
        
2分
;
2分
; return
2分
; }
| 参考答案
填空#1
Tmp = Tmp->Next
填空#2
Tmp->Next = L2
填空#3
L1
| 评测详情
填空详情
6分
5-3

Concatenation of lists is an operation where the elements of one list are added at the end of another list. For example, if we have a linked list L1→1→2→3 and another one L2→4→5→6. The function ListConcat is to return the head pointer of the list L→4→5→6→1→2→3.

The list structure is defined as the following:

typedef struct Node *PtrToNode;
struct Node{
    int Data;
    PtrToNode Next;
};
typedef PtrToNode List;

Please fill in the blanks.

List ListConcat( List L1, List L2 )
{
    List Tmp = L2;
    if ( !L2 ) return L1;
    while ( Tmp->Next )
        
2分
;
2分
; return
2分
; }
| 参考答案
填空#1
Tmp = Tmp->Next
填空#2
Tmp->Next = L1
填空#3
L2
| 评测详情
填空详情
6分